﻿using Microsoft.AspNetCore.Builder;
using System.Reflection;
using Zy.Shared.Rpc.GrpcBase;

namespace Zy.Shared.Rpc.Registers
{
    /// <summary>
    /// 
    /// </summary>
    public static class UseZyGrpcService
    {
        /// <summary>
        /// 使用Grpc
        /// </summary>
        /// <param name="app"></param>
        /// <param name="assembly"></param>
        /// <returns></returns>
        public static WebApplication MapZyGrpcService(this WebApplication app, Assembly assembly)
        {
            // 启用 gRPC-Web 支持，默认情况下启用
            app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

            // 获取 IGrpcBaseServerService 接口类型
            var appServiceType = typeof(IGrpcBaseServerService);

            // 查找所有导出的类型，这些类型是类、实现了 IGrpcBaseServerService 接口且不是抽象类
            var serviceTypes = assembly
                .GetExportedTypes()
                .Where(type => type.IsClass && type.IsAssignableTo(appServiceType) && !type.IsAbstract)
                .ToList();

            // 遍历找到的服务类型并映射它们
            foreach (var item in serviceTypes)
            {
                // 获取 MapGrpcService 方法并创建泛型方法
                var method = typeof(GrpcEndpointRouteBuilderExtensions).GetMethod("MapGrpcService").MakeGenericMethod(item);

                // 调用 MapGrpcService 方法来映射服务
                method.Invoke(null, new[] { app });
            }

            // 映射根路径以返回服务状态信息
            //app.MapGet("/", () => "This gRPC service is gRPC-Web enabled and is callable from browser apps using the gRPC-Web protocol");

            // 返回配置后的 WebApplication 实例
            return app;
        }

    }
}